home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / gepackte_disketten / 1993 / 10_93_2.dms / 10_93_2.adf / SAS-Libraries / stack.c < prev    next >
C/C++ Source or Header  |  1993-09-27  |  1KB  |  65 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <exec/semaphores.h>
  4. #include <proto/exec.h>
  5.  
  6. struct StackEntry {
  7.     struct Node se_Node;
  8.     ULONG se_Value;
  9. };
  10.  
  11. struct SignalSemaphore StackSema;
  12. struct List StackList;
  13. struct Library *SysBase;
  14.  
  15. int __saveds __asm
  16. __UserLibInit (register __a6
  17. struct Library *stacklib) {
  18.     SysBase = (*((void**)4));
  19.     NewList(&StackList);
  20.     InitSemaphore(&StackSema);
  21.     return(0);
  22. }
  23.  
  24. void __saveds __asm
  25. __UserLibCleanup (register __a6
  26. struct Library *stacklib) {
  27.     struct StackEntry *se;
  28.     while(se = (struct StackEntry*)
  29.               RemHead(&StackList)) {
  30.         FreeMem((UBYTE*)se,
  31.          sizeof(struct StackEntry));
  32.     }
  33.     return;
  34. }
  35.  
  36. ULONG __asm __saveds LIB_Pop(void) {
  37.     ULONG val = -1;
  38.     struct StackEntry *se;
  39.     ObtainSemaphore(&StackSema);
  40.     if(se = (struct StackEntry*)
  41.              RemHead(&StackList)) {
  42.         val = se->se_Value;
  43.         FreeMem((UBYTE*)se,
  44.         sizeof(struct StackEntry));
  45.     }
  46.     ReleaseSemaphore(&StackSema);
  47.     return(val);
  48. }
  49.  
  50. ULONG __asm __saveds
  51. LIB_Push(register __d0 ULONG val) {
  52.     struct StackEntry *se;
  53.     ObtainSemaphore(&StackSema);
  54.     if(se=(struct StackEntry*)AllocMem
  55.     (sizeof(struct StackEntry),
  56.          MEMF_PUBLIC|MEMF_CLEAR)) {
  57.         se->se_Value = val;
  58.         AddHead(&StackList,&se->se_Node);
  59.     }
  60.     else val = -1;
  61.     ReleaseSemaphore(&StackSema);
  62.     return(val);
  63. }
  64.  
  65.